#include "Billboard.h"
#include "stdafx.h"

Billboard::Billboard():Objet()
{
	plans = new Plan[2];
	setTextureMapping(rien);
}

Billboard::Billboard(Point centre1, PPMImage image,float coffTexture, Vecteur v):Objet()
{
	setTextureMapping(rien);

	centre = centre1;
	plans = new Plan[2];

	Vecteur vup = Vecteur(0.0f,1.0f,0.0000001f);
	vup.normalize();
	 
	Vecteur w = v.produitVectoriel(vup);
	w.normalize();

	vup = v.produitVectoriel(w);
	vup.normalize();

	Matrice repere;

	repere.createObsGlob(w,vup,v,centre);
	
	Vecteur normaleZ(0.0f,0.0f,1.0f);
	Vecteur normaleY(0.0f,1.0f,0.0f);
	Vecteur normaleX(1.0f,0.0f,0.0f);
	Vecteur normale = repere*normaleZ;
	Vecteur y= repere*normaleY;
	Vecteur x= repere*normaleX;

	plans[0] = Plan(normale,centre);
	plans[0].setTextureImage(image);
	plans[0].setTextureMapping(planar);
	plans[0].setCentreTexture(centre);
	plans[0].setIsBillboard(true);
	plans[0].setVertical(normale);
	plans[0].setHorizon(normale);
	plans[0].setCoffTexture(coffTexture);

	plans[1] = Plan(x,centre);
	plans[1].setTextureImage(image);
	plans[1].setTextureMapping(planar);
	plans[1].setCentreTexture(centre);
	plans[1].setIsBillboard(true);
	plans[1].setVertical(x);
	plans[1].setHorizon(normale);
	plans[1].setCoffTexture(coffTexture);

}

Billboard::~Billboard(){}

bool Billboard::intersection(Rayon r)
{
	Intersection interTemp;
	inter = interTemp;
	Couleur c;
	float minT = MAXFLOAT;
	for (int i=0 ; i<2 ; i++) {
		bool flag = plans[i].intersection(r);
		interTemp = plans[i].getIntersection();
		if (flag && interTemp.getT()< minT) {
			Couleur textureCouleur = plans[i].getCouleurTexture(interTemp.getPoint());
			if (textureCouleur != Couleur(1.0f,1.0f,1.0f)) {
				minT = interTemp.getT();
				inter = interTemp;
				c = textureCouleur;
			}
		}
	}
	
	if(inter.getT() != MAXFLOAT)
	{
		inter.setObjet(this);
		inter.setCouleur(c);
		setCouleur(c);
		return true;
	}
	else
		return false;
}

BoiteEnglobante Billboard::getBoite()
{
	BoiteEnglobante b;
	return b;
}

bool Billboard::aBoite()
{
	return false;
}